/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import business.BasketMgr;
import business.Category;
import business.Customer;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import toolbox.CategoryMgr;
import toolbox.MailMgr;
import toolbox.Validators;

/**
 * Servlet chargée de gérer la commande du client
 * Affiche les formulaires correspondant au 4 première étapes de la commande.
 * Envoie un e-mail à l'équipe BMG et au client et affichage un message
 * de confirmation
 *
 * Gère les MessagingException et renvoie les autres exceptions capturées à
 * la servlet ErrorHandler
 *
 * @author Thomas
 * @version 1.0
 * @see controller.ErrorHandler
 */
public class Order extends HttpServlet {

    private HttpSession session;
    private BasketMgr basket;
    private List<Category> categories;
    private Customer customer;
    private RequestDispatcher dispatcher;

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        try {

            session = request.getSession();
            if (session.getAttribute("basket") == null) {
                // Création d'un panier stocké en session
                session.setAttribute("basket", new BasketMgr());
            }
            basket = (BasketMgr)session.getAttribute("basket");
            categories = CategoryMgr.getList();
            request.setAttribute("categories", categories); //-> _left.jsp

            if(basket.getProducts().isEmpty()) {
                // pas de panier, pas de produit... pas de produit, pas de commande... pas de commande, pas de commande !
                dispatcher = request.getRequestDispatcher("panier.jsp");
            } else if (request.getParameter("cancel") != null) {
                // Clique sur "annuler"
                dispatcher = request.getRequestDispatcher("/Index");
            } else {

                // 1. Edition et enregistrement des coordonnées du client
                if (request.getParameter("action") != null & request.getParameter("action").equals("editerClient")) {

                    if (session.getAttribute("customer") == null) {
                        // Création d'un client stocké en session
                        session.setAttribute("customer", new Customer());
                    }
                    customer = (Customer)session.getAttribute("customer");

                    // Clique sur "suivant"
                    if (request.getParameter("next") != null) {

                        customer.setLastName(request.getParameter("lastname"));
                        customer.setFirstName(request.getParameter("firstname"));
                        customer.setEmail(request.getParameter("email"));
                        customer.setNumTel(request.getParameter("phonenumber"));

                        // Validation des champs
                        if (Validators.customer(customer).isEmpty()) {
                            // Pas d'erreur, on continue
                            dispatcher = request.getRequestDispatcher("adresse.jsp");
                        } else {
                            // Erreur(s) trouvée(s), on passe la HashMap à la vue
                            request.setAttribute("errorMap", Validators.customer(customer));
                        }

                    // Pas encore cliqué ou erreur(s) de validation...
                    } else {
                        dispatcher = request.getRequestDispatcher("client.jsp");
                    }

                // 2. Edition et enregistrement de l'adresse du client
                } else if (request.getParameter("action") != null && request.getParameter("action").equals("editerAdresse")) {

                    // Clique sur "continuer"
                    if (request.getParameter("next") != null || request.getParameter("previous") != null) {

                        customer.getAddress().setLine1((String)request.getParameter("line1"));
                        customer.getAddress().setLine2((String)request.getParameter("line2"));
                        customer.getAddress().setZipCode((String)request.getParameter("zipcode"));
                        customer.getAddress().setCity((String)request.getParameter("city"));
                        if (!request.getParameter("country").isEmpty()) {
                            customer.getAddress().setCountry((String)request.getParameter("country"));
                        } else {
                            customer.getAddress().setCountry("Belgique");
                        }

                        // Validation des champs et Navigation dans les étapes de la commande
                        if (request.getParameter("next") != null && Validators.address(customer.getAddress()).isEmpty()) {
                            // Pas d'erreur, on continue
                            dispatcher = request.getRequestDispatcher("commande.jsp");
                        } else if (request.getParameter("previous") != null) {
                            // Clique sur "previous"
                            dispatcher = request.getRequestDispatcher("client.jsp");
                        } else {
                            // Erreur(s) trouvée(s), on passe la HashMap à la vue
                            request.setAttribute("errorMap", Validators.address(customer.getAddress()));
                        }

                    // Pas encore cliqué ou erreur(s) de validation...
                    } else {
                        dispatcher = request.getRequestDispatcher("adresse.jsp");
                    }

                // 3. Edition du panier et validation de la commande
                } else if (request.getParameter("action") != null && request.getParameter("action").equals("validerCommande")) {

                    // stockage en session de la servlet et des paramètres pour rappeler la page d'origine
                    session.setAttribute("removeProduct", "/Order?action=validerCommande");

                    if (request.getParameter("next") != null) {
                        // Clique sur "next"
                        dispatcher = request.getRequestDispatcher("validation.jsp");
                    } else if (request.getParameter("previous") != null) {
                        // Clique sur "previous"
                        dispatcher = request.getRequestDispatcher("adresse.jsp");
                    } else {
                        // Pas encore cliqué
                        dispatcher = request.getRequestDispatcher("commande.jsp");
                    }

                // 4. Envoi de la commande par e-mail
                } else if (request.getParameter("action") != null && request.getParameter("action").equals("envoyerCommande")) {

                    if (request.getParameter("next") != null) {
                        // Clique sur "suivant"
                        dispatcher = request.getRequestDispatcher("confirmation.jsp");
                        MailMgr.send(customer, basket);
                    } else if (request.getParameter("previous") != null) {
                        // Clique sur "previous"
                        dispatcher = request.getRequestDispatcher("commande.jsp");
                    } else {
                        // Pas encore cliqué...
                        dispatcher = request.getRequestDispatcher("validation.jsp");
                    }
                }
            }

        } catch (MessagingException e) {
            request.setAttribute("error_msg", "D&eacute;sol&eacute; ! Nous n'avons pas pu acc&eacute;der &agrave; votre requ&ecirc;te. Veuillez r&eacute;essayer.");
        } catch (Exception e) {
            Logger.getLogger(Index.class.getName()).log(Level.SEVERE, null, e);
            dispatcher = request.getRequestDispatcher("/ErrorHandler");
        } finally {
            dispatcher.forward(request, response);
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}